{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 170,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn import metrics\n",
    "import warnings\n",
    "import seaborn as sn\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "warnings.filterwarnings('ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>instant</th>\n",
       "      <th>season_1</th>\n",
       "      <th>season_2</th>\n",
       "      <th>season_3</th>\n",
       "      <th>season_4</th>\n",
       "      <th>mnth_1</th>\n",
       "      <th>mnth_2</th>\n",
       "      <th>mnth_3</th>\n",
       "      <th>mnth_4</th>\n",
       "      <th>mnth_5</th>\n",
       "      <th>...</th>\n",
       "      <th>weekday_5</th>\n",
       "      <th>weekday_6</th>\n",
       "      <th>temp</th>\n",
       "      <th>atemp</th>\n",
       "      <th>hum</th>\n",
       "      <th>windspeed</th>\n",
       "      <th>holiday</th>\n",
       "      <th>workingday</th>\n",
       "      <th>yr</th>\n",
       "      <th>cnt</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0.355170</td>\n",
       "      <td>0.373517</td>\n",
       "      <td>0.828620</td>\n",
       "      <td>0.284606</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>985</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.379232</td>\n",
       "      <td>0.360541</td>\n",
       "      <td>0.715771</td>\n",
       "      <td>0.466215</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>801</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.171000</td>\n",
       "      <td>0.144830</td>\n",
       "      <td>0.449638</td>\n",
       "      <td>0.465740</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1349</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.175530</td>\n",
       "      <td>0.174649</td>\n",
       "      <td>0.607131</td>\n",
       "      <td>0.284297</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1562</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0.209120</td>\n",
       "      <td>0.197158</td>\n",
       "      <td>0.449313</td>\n",
       "      <td>0.339143</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1600</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 35 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   instant  season_1  season_2  season_3  season_4  mnth_1  mnth_2  mnth_3  \\\n",
       "0        1         1         0         0         0       1       0       0   \n",
       "1        2         1         0         0         0       1       0       0   \n",
       "2        3         1         0         0         0       1       0       0   \n",
       "3        4         1         0         0         0       1       0       0   \n",
       "4        5         1         0         0         0       1       0       0   \n",
       "\n",
       "   mnth_4  mnth_5  ...   weekday_5  weekday_6      temp     atemp       hum  \\\n",
       "0       0       0  ...           0          1  0.355170  0.373517  0.828620   \n",
       "1       0       0  ...           0          0  0.379232  0.360541  0.715771   \n",
       "2       0       0  ...           0          0  0.171000  0.144830  0.449638   \n",
       "3       0       0  ...           0          0  0.175530  0.174649  0.607131   \n",
       "4       0       0  ...           0          0  0.209120  0.197158  0.449313   \n",
       "\n",
       "   windspeed  holiday  workingday  yr   cnt  \n",
       "0   0.284606        0           0   0   985  \n",
       "1   0.466215        0           0   0   801  \n",
       "2   0.465740        0           1   0  1349  \n",
       "3   0.284297        0           1   0  1562  \n",
       "4   0.339143        0           1   0  1600  \n",
       "\n",
       "[5 rows x 35 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X = pd.read_csv(\"FE_day.csv\")\n",
    "X.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = X['cnt']\n",
    "X = X.drop('cnt',axis = 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 问题3:拆分测试集和训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 问题4.1:最小二乘"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LinearRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 175,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "738106.0659983087\n"
     ]
    }
   ],
   "source": [
    "# 计算OLS 在测试集上面的得分（RMSE）\n",
    "OLS = LinearRegression()\n",
    "OLS.fit(X_train,y_train)\n",
    "OLS_predict = OLS.predict(X_test)\n",
    "OLS_score = metrics.mean_squared_error(y_test,OLS_predict)\n",
    "print(OLS_score) # 738106"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 问题4.2:岭回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import Ridge"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 176,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'alpha': 0.1}\n"
     ]
    }
   ],
   "source": [
    "# alpha 正则参数调优\n",
    "Ridge_Bike = Ridge()\n",
    "parameters = {'alpha':[10 ** i for i in range(-4,4)]}\n",
    "clf = GridSearchCV(Ridge_Bike, parameters, scoring = 'neg_mean_squared_error')\n",
    "clf.fit(X_train,y_train)\n",
    "#print(clf.cv_results_)\n",
    "print(clf.best_params_)\n",
    "#print(clf.best_score_)\n",
    "#print(clf.best_estimator_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "702850.2258085099\n"
     ]
    }
   ],
   "source": [
    "# 计算Lasso模型 在测试集上面的得分（RMSE）\n",
    "Ridge_Bike = clf.best_estimator_\n",
    "Ridge_Bike.fit(X_train,y_train)\n",
    "Ridge_predict = Ridge_Bike.predict(X_test)\n",
    "Ridge_score = metrics.mean_squared_error(y_test,Ridge_predict)\n",
    "print(Ridge_score)  # 702850"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 问题4.3:Lasso模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import Lasso"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 178,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'alpha': 1}\n"
     ]
    }
   ],
   "source": [
    "# alpha 正则参数调优\n",
    "Lasso_Bike = Lasso()\n",
    "parameters = {'alpha':[10 ** i for i in range(-4,4)]}\n",
    "clf = GridSearchCV(Lasso_Bike, parameters, scoring = 'neg_mean_squared_error')\n",
    "clf.fit(X_train,y_train)\n",
    "#print(clf.cv_results_)\n",
    "print(clf.best_params_)\n",
    "#print(clf.best_score_)\n",
    "#print(clf.best_estimator_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 179,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "713681.015738684\n"
     ]
    }
   ],
   "source": [
    "# 计算Lasso模型 在测试集上面的得分（RMSE）\n",
    "Lasso_Bike = clf.best_estimator_\n",
    "Lasso_Bike.fit(X_train,y_train)\n",
    "Lasso_predict = Lasso_Bike.predict(X_test)\n",
    "Lasso_score = metrics.mean_squared_error(y_test,Lasso_predict)\n",
    "print(Lasso_score) # 713681"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 问题5:比较三种模型的系数和在测试集上面的性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [],
   "source": [
    "coef = pd.DataFrame([OLS.coef_,Ridge_Bike.coef_,Lasso_Bike.coef_]) #coef\n",
    "coef = coef.T\n",
    "coef.columns = ['OLS','Ridge','Lasso']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 183,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig,ax = plt.subplots()\n",
    "sn.violinplot(data= coef[['OLS','Ridge','Lasso']])\n",
    "ax.set(title=\"Coef of the Models\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 通过画出小提琴图分析三种模型的系数分布情况，可以看出: Ridge和Lasso的系数分布情况比OLS更集中并且稳定。从整体的系数取值范围来看, Ridge是略优于Lasso的, 但是Lasso模型的系数在0附近的集中程度最高。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 180,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>OLS</th>\n",
       "      <th>Ridge</th>\n",
       "      <th>Lasso</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>859.130995</td>\n",
       "      <td>838.361632</td>\n",
       "      <td>844.796434</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          OLS       Ridge       Lasso\n",
       "0  859.130995  838.361632  844.796434"
      ]
     },
     "execution_count": 180,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "score = pd.DataFrame([OLS_score ** 0.5,Ridge_score ** 0.5 ,Lasso_score ** 0.5])\n",
    "score = score.T\n",
    "score.columns = ['OLS','Ridge','Lasso']\n",
    "score"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 181,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<function matplotlib.pyplot.show(*args, **kw)>"
      ]
     },
     "execution_count": 181,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig,ax = plt.subplots()\n",
    "sn.barplot(data = score[['OLS','Ridge','Lasso']])\n",
    "plt.axis([None,None,600,900])\n",
    "ax.set(title=\"Score of the Models\")\n",
    "plt.show"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 通过画出三种模型在测试集上得分情况（RMSE）的柱状图，可以看出，这三种模型的得分差别不是特别大，相对而言，Ridge优于Lasso, Lasso优于OLS."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
